bitkeeper revision 1.1159.252.1 (4208e2a42Fwe83QQfJdFQI8V302tYg)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Tue, 8 Feb 2005 16:02:44 +0000 (16:02 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Tue, 8 Feb 2005 16:02:44 +0000 (16:02 +0000)
Reorganise mm.h to split out 32-bit and 64-bit definitions. Fix x86_64
definitions to mask out the bits that we don't care about.
Signed-off-by: keir.fraser@cl.cam.ac.uk
.rootkeys
xen/arch/x86/dom0_ops.c
xen/arch/x86/mm.c
xen/arch/x86/x86_32/domain_build.c
xen/arch/x86/x86_32/mm.c
xen/arch/x86/x86_64/domain_build.c
xen/arch/x86/x86_64/mm.c
xen/include/asm-x86/page.h
xen/include/asm-x86/x86_32/page.h [new file with mode: 0644]
xen/include/asm-x86/x86_64/page.h [new file with mode: 0644]

index 7a3f24fd752a862c686321a8f37963b10f2269f1..e3c0b4fdb03792a099e65bafd195690e31aef973 100644 (file)
--- a/.rootkeys
+++ b/.rootkeys
 418fbcfe_WliJPToeVM-9VStvym-hw xen/include/asm-x86/x86_32/asm_defns.h
 3ddb79c2ADvRmdexd9y3AYK9_NTx-Q xen/include/asm-x86/x86_32/current.h
 3e20b82fl1jmQiKdLy7fxMcutfpjWA xen/include/asm-x86/x86_32/domain_page.h
+4208e2a3ZNFroNXbX9OYaOB-xtUyDQ xen/include/asm-x86/x86_32/page.h
 3ddb79c3mbqEM7QQr3zVq7NiBNhouA xen/include/asm-x86/x86_32/regs.h
 3e7f358aG11EvMI9VJ4_9hD4LUO7rQ xen/include/asm-x86/x86_32/string.h
 3ddb79c3M2n1ROZH6xk3HbyN4CPDqg xen/include/asm-x86/x86_32/uaccess.h
 404f1b9ceJeGVaPNIENm2FkK0AgEOQ xen/include/asm-x86/x86_64/current.h
 41febc4b1aCGLsm0Y0b_82h7lFtrEA xen/include/asm-x86/x86_64/domain_page.h
 404f1badfXZJZ2sU8sh9PS2EZvd19Q xen/include/asm-x86/x86_64/ldt.h
+4208e2a3Fktw4ZttKdDxbhvTQ6brfQ xen/include/asm-x86/x86_64/page.h
 404f1bb86rAXB3aLS1vYdcqpJiEcyg xen/include/asm-x86/x86_64/regs.h
 40e1966azOJZfNI6Ilthe6Q-T3Hewg xen/include/asm-x86/x86_64/string.h
 404f1bc4tWkB9Qr8RkKtZGW5eMQzhw xen/include/asm-x86/x86_64/uaccess.h
index 84bc49eed6fe61eddc09bc05902d1b2a0e464a33..fdc57902205aac108f74d08e3dbadc59d41e41c6 100644 (file)
@@ -376,7 +376,7 @@ void arch_getdomaininfo_ctxt(
     {
         for ( i = 0; i < 16; i++ )
             c->gdt_frames[i] = 
-                l1_pgentry_to_pagenr(ed->arch.perdomain_ptes[i]);
+                l1_pgentry_to_pfn(ed->arch.perdomain_ptes[i]);
         c->gdt_ents = GET_GDT_ENTRIES(ed);
     }
     c->guestos_ss  = ed->arch.guestos_ss;
index bcf927ef509dd5e1c3cac26119e44bff0ba20f28..5d087d3df06ec5788f70f3abc7b75c19be999739 100644 (file)
@@ -226,7 +226,7 @@ static void __invalidate_shadow_ldt(struct exec_domain *d)
 
     for ( i = 16; i < 32; i++ )
     {
-        pfn = l1_pgentry_to_pagenr(d->arch.perdomain_ptes[i]);
+        pfn = l1_pgentry_to_pfn(d->arch.perdomain_ptes[i]);
         if ( pfn == 0 ) continue;
         d->arch.perdomain_ptes[i] = mk_l1_pgentry(0);
         page = &frame_table[pfn];
@@ -364,14 +364,14 @@ get_linear_pagetable(
     if ( (l2_pgentry_val(l2e) >> PAGE_SHIFT) != pfn )
     {
         /* Make sure the mapped frame belongs to the correct domain. */
-        if ( unlikely(!get_page_from_pagenr(l2_pgentry_to_pagenr(l2e), d)) )
+        if ( unlikely(!get_page_from_pagenr(l2_pgentry_to_pfn(l2e), d)) )
             return 0;
 
         /*
          * Make sure that the mapped frame is an already-validated L2 table. 
          * If so, atomically increment the count (checking for overflow).
          */
-        page = &frame_table[l2_pgentry_to_pagenr(l2e)];
+        page = &frame_table[l2_pgentry_to_pfn(l2e)];
         y = page->u.inuse.type_info;
         do {
             x = y;
@@ -395,7 +395,7 @@ get_page_from_l1e(
     l1_pgentry_t l1e, struct domain *d)
 {
     unsigned long l1v = l1_pgentry_val(l1e);
-    unsigned long pfn = l1_pgentry_to_pagenr(l1e);
+    unsigned long pfn = l1_pgentry_to_pfn(l1e);
     struct pfn_info *page = &frame_table[pfn];
     extern int domain_iomem_in_pfn(struct domain *d, unsigned long pfn);
 
@@ -449,7 +449,7 @@ get_page_from_l2e(
     }
 
     rc = get_page_and_type_from_pagenr(
-        l2_pgentry_to_pagenr(l2e), 
+        l2_pgentry_to_pfn(l2e), 
         PGT_l1_page_table | (va_idx<<PGT_va_shift), d);
 
     if ( unlikely(!rc) )
@@ -462,7 +462,7 @@ get_page_from_l2e(
 static void put_page_from_l1e(l1_pgentry_t l1e, struct domain *d)
 {
     unsigned long    l1v  = l1_pgentry_val(l1e);
-    unsigned long    pfn  = l1_pgentry_to_pagenr(l1e);
+    unsigned long    pfn  = l1_pgentry_to_pfn(l1e);
     struct pfn_info *page = &frame_table[pfn];
     struct domain   *e;
 
@@ -512,7 +512,7 @@ static void put_page_from_l2e(l2_pgentry_t l2e, unsigned long pfn)
 {
     if ( (l2_pgentry_val(l2e) & _PAGE_PRESENT) && 
          ((l2_pgentry_val(l2e) >> PAGE_SHIFT) != pfn) )
-        put_page_and_type(&frame_table[l2_pgentry_to_pagenr(l2e)]);
+        put_page_and_type(&frame_table[l2_pgentry_to_pfn(l2e)]);
 }
 
 
@@ -1670,7 +1670,7 @@ void destroy_gdt(struct exec_domain *ed)
 
     for ( i = 0; i < 16; i++ )
     {
-        if ( (pfn = l1_pgentry_to_pagenr(ed->arch.perdomain_ptes[i])) != 0 )
+        if ( (pfn = l1_pgentry_to_pfn(ed->arch.perdomain_ptes[i])) != 0 )
             put_page_and_type(&frame_table[pfn]);
         ed->arch.perdomain_ptes[i] = mk_l1_pgentry(0);
     }
@@ -1798,7 +1798,7 @@ long do_update_descriptor(
     case PGT_gdt_page:
         /* Disallow updates of Xen-reserved descriptors in the current GDT. */
         for_each_exec_domain(current->domain, ed) {
-            if ( (l1_pgentry_to_pagenr(ed->arch.perdomain_ptes[0]) == pfn) &&
+            if ( (l1_pgentry_to_pfn(ed->arch.perdomain_ptes[0]) == pfn) &&
                  (((pa&(PAGE_SIZE-1))>>3) >= FIRST_RESERVED_GDT_ENTRY) &&
                  (((pa&(PAGE_SIZE-1))>>3) <= LAST_RESERVED_GDT_ENTRY) )
                 goto out;
@@ -1939,7 +1939,7 @@ void ptwr_flush(const int which)
                     l1pte_propagate_from_guest(
                         d, &l1_pgentry_val(nl1e), 
                         &l1_pgentry_val(sl1e[i]));
-                put_page_type(&frame_table[l1_pgentry_to_pagenr(nl1e)]);
+                put_page_type(&frame_table[l1_pgentry_to_pfn(nl1e)]);
             }
             continue;
         }
index 540909f59c40e7cd85768c02af569677b98aee87..93ea520dfcdb25ff5b4328846e9d2f43bcc129b0 100644 (file)
@@ -262,7 +262,7 @@ int construct_dom0(struct domain *d,
     for ( count = 0; count < nr_pt_pages; count++ ) 
     {
         *l1tab = mk_l1_pgentry(l1_pgentry_val(*l1tab) & ~_PAGE_RW);
-        page = &frame_table[l1_pgentry_to_pagenr(*l1tab)];
+        page = &frame_table[l1_pgentry_to_pfn(*l1tab)];
         if ( count == 0 )
         {
             page->u.inuse.type_info &= ~PGT_type_mask;
index d9d00cc3c6dc90c3fac37ef6c75f27391f27c125..ba5ce4ff0de0a527ec326319f33b498f3ea855a8 100644 (file)
@@ -164,7 +164,7 @@ void subarch_init_memory(struct domain *dom_xen)
     }
 
     /* M2P table is mappable read-only by privileged domains. */
-    m2p_start_mfn = l2_pgentry_to_pagenr(
+    m2p_start_mfn = l2_pgentry_to_pfn(
         idle_pg_table[l2_table_offset(RDWR_MPT_VIRT_START)]);
     for ( i = 0; i < 1024; i++ )
     {
index bd15fe9eeb8b6b9ae17f5c8b7746651d4ff2a5a1..8d3355667be4aab3b2e6c5a4d0e70f63c489af90 100644 (file)
@@ -294,7 +294,7 @@ int construct_dom0(struct domain *d,
     for ( count = 0; count < nr_pt_pages; count++ ) 
     {
         *l1tab = mk_l1_pgentry(l1_pgentry_val(*l1tab) & ~_PAGE_RW);
-        page = &frame_table[l1_pgentry_to_pagenr(*l1tab)];
+        page = &frame_table[l1_pgentry_to_pfn(*l1tab)];
 
         /* Read-only mapping + PGC_allocated + page-table page. */
         page->count_info         = PGC_allocated | 3;
index 08f9e8298021ad38e390ca6495476390b62058fe..f8c48f7981375388cddf8e8997658d7dc8b55ff2 100644 (file)
@@ -199,7 +199,7 @@ void subarch_init_memory(struct domain *dom_xen)
         l2e = l3_pgentry_to_l2(l3e)[l2_table_offset(v)];
         if ( !(l2_pgentry_val(l2e) & _PAGE_PRESENT) )
             continue;
-        m2p_start_mfn = l2_pgentry_to_pagenr(l2e);
+        m2p_start_mfn = l2_pgentry_to_pfn(l2e);
 
         for ( i = 0; i < ENTRIES_PER_L1_PAGETABLE; i++ )
         {
index 7f3dad32fb9af1b8b4691d041a35a6627327e499..51aa0db52aab411ea39d7dd6c37d94fe7e954142 100644 (file)
@@ -1,39 +1,14 @@
-/******************************************************************************
- * asm-x86/page.h
- * 
- * Definitions relating to page tables.
- */
+/* -*-  Mode:C; c-basic-offset:4; tab-width:4; indent-tabs-mode:nil -*- */
 
 #ifndef __X86_PAGE_H__
 #define __X86_PAGE_H__
 
-#if defined(__x86_64__)
-
-#define L1_PAGETABLE_SHIFT       12
-#define L2_PAGETABLE_SHIFT       21
-#define L3_PAGETABLE_SHIFT       30
-#define L4_PAGETABLE_SHIFT       39
-
-#define ENTRIES_PER_L1_PAGETABLE 512
-#define ENTRIES_PER_L2_PAGETABLE 512
-#define ENTRIES_PER_L3_PAGETABLE 512
-#define ENTRIES_PER_L4_PAGETABLE 512
-
-#define __PAGE_OFFSET          (0xFFFF830000000000)
-
-#elif defined(__i386__)
-
-#define L1_PAGETABLE_SHIFT       12
-#define L2_PAGETABLE_SHIFT       22
-
-#define ENTRIES_PER_L1_PAGETABLE 1024
-#define ENTRIES_PER_L2_PAGETABLE 1024
-
-#define __PAGE_OFFSET          (0xFC400000)
-
+#if defined(__i386__)
+#include <asm/x86_32/page.h>
+#elif defined(__x86_64__)
+#include <asm/x86_64/page.h>
 #endif
 
-#define PAGE_SHIFT               L1_PAGETABLE_SHIFT
 #ifndef __ASSEMBLY__
 #define PAGE_SIZE               (1UL << PAGE_SHIFT)
 #else
 #define clear_page(_p)           memset((void *)(_p), 0, PAGE_SIZE)
 #define copy_page(_t,_f)         memcpy((void *)(_t), (void *)(_f), PAGE_SIZE)
 
-#ifndef __ASSEMBLY__
-#include <xen/config.h>
-typedef struct { unsigned long l1_lo; } l1_pgentry_t;
-typedef struct { unsigned long l2_lo; } l2_pgentry_t;
-typedef struct { unsigned long l3_lo; } l3_pgentry_t;
-typedef struct { unsigned long l4_lo; } l4_pgentry_t;
-#endif /* !__ASSEMBLY__ */
-
-/* Strip type from a table entry. */
-#define l1_pgentry_val(_x) ((_x).l1_lo)
-#define l2_pgentry_val(_x) ((_x).l2_lo)
-#define l3_pgentry_val(_x) ((_x).l3_lo)
-#define l4_pgentry_val(_x) ((_x).l4_lo)
-
-/* Add type to a table entry. */
-#define mk_l1_pgentry(_x)  ( (l1_pgentry_t) { (_x) } )
-#define mk_l2_pgentry(_x)  ( (l2_pgentry_t) { (_x) } )
-#define mk_l3_pgentry(_x)  ( (l3_pgentry_t) { (_x) } )
-#define mk_l4_pgentry(_x)  ( (l4_pgentry_t) { (_x) } )
-
-/* Turn a typed table entry into a page index. */
-#define l1_pgentry_to_pagenr(_x) (l1_pgentry_val(_x) >> PAGE_SHIFT) 
-#define l2_pgentry_to_pagenr(_x) (l2_pgentry_val(_x) >> PAGE_SHIFT)
-#define l3_pgentry_to_pagenr(_x) (l3_pgentry_val(_x) >> PAGE_SHIFT)
-#define l4_pgentry_to_pagenr(_x) (l4_pgentry_val(_x) >> PAGE_SHIFT)
-
-/* Turn a typed table entry into a physical address. */
-#define l1_pgentry_to_phys(_x) (l1_pgentry_val(_x) & PAGE_MASK)
-#define l2_pgentry_to_phys(_x) (l2_pgentry_val(_x) & PAGE_MASK)
-#define l3_pgentry_to_phys(_x) (l3_pgentry_val(_x) & PAGE_MASK)
-#define l4_pgentry_to_phys(_x) (l4_pgentry_val(_x) & PAGE_MASK)
-
-/* Pagetable walking. */
-#define l2_pgentry_to_l1(_x) \
-  ((l1_pgentry_t *)__va(l2_pgentry_val(_x) & PAGE_MASK))
-#define l3_pgentry_to_l2(_x) \
-  ((l2_pgentry_t *)__va(l3_pgentry_val(_x) & PAGE_MASK))
-#define l4_pgentry_to_l3(_x) \
-  ((l3_pgentry_t *)__va(l4_pgentry_val(_x) & PAGE_MASK))
-
-/* Given a virtual address, get an entry offset into a page table. */
-#define l1_table_offset(_a) \
-  (((_a) >> L1_PAGETABLE_SHIFT) & (ENTRIES_PER_L1_PAGETABLE - 1))
-#if defined(__i386__)
-#define l2_table_offset(_a) \
-  ((_a) >> L2_PAGETABLE_SHIFT)
-#elif defined(__x86_64__)
-#define l2_table_offset(_a) \
-  (((_a) >> L2_PAGETABLE_SHIFT) & (ENTRIES_PER_L2_PAGETABLE - 1))
-#define l3_table_offset(_a) \
-  (((_a) >> L3_PAGETABLE_SHIFT) & (ENTRIES_PER_L3_PAGETABLE - 1))
-#define l4_table_offset(_a) \
-  (((_a) >> L4_PAGETABLE_SHIFT) & (ENTRIES_PER_L4_PAGETABLE - 1))
-#endif
-
-/* Given a virtual address, get an entry offset into a linear page table. */
-#if defined(__i386__)
-#define l1_linear_offset(_a) ((_a) >> PAGE_SHIFT)
-#elif defined(__x86_64__)
-#define l1_linear_offset(_a) (((_a) & ((1UL << 48) - 1)) >> PAGE_SHIFT)
-#endif
-
-#if defined(__i386__)
-#define pagetable_t l2_pgentry_t
-#define pagetable_val(_x)  ((_x).l2_lo)
-#define mk_pagetable(_x)   ( (l2_pgentry_t) { (_x) } )
-#define ENTRIES_PER_PAGETABLE ENTRIES_PER_L2_PAGETABLE
-#elif defined(__x86_64__)
-#define pagetable_t l4_pgentry_t
-#define pagetable_val(_x)  ((_x).l4_lo)
-#define mk_pagetable(_x)   ( (l4_pgentry_t) { (_x) } )
-#define ENTRIES_PER_PAGETABLE ENTRIES_PER_L4_PAGETABLE
-#endif
-
 #define PAGE_OFFSET            ((unsigned long)__PAGE_OFFSET)
 #define __pa(x)                        ((unsigned long)(x)-PAGE_OFFSET)
 #define __va(x)                        ((void *)((unsigned long)(x)+PAGE_OFFSET))
-#define page_address(_p)        (__va(((_p) - frame_table) << PAGE_SHIFT))
 #define pfn_to_page(_pfn)       (frame_table + (_pfn))
 #define phys_to_page(kaddr)     (frame_table + ((kaddr) >> PAGE_SHIFT))
 #define virt_to_page(kaddr)    (frame_table + (__pa(kaddr) >> PAGE_SHIFT))
diff --git a/xen/include/asm-x86/x86_32/page.h b/xen/include/asm-x86/x86_32/page.h
new file mode 100644 (file)
index 0000000..1c46ef1
--- /dev/null
@@ -0,0 +1,56 @@
+/* -*-  Mode:C; c-basic-offset:4; tab-width:4; indent-tabs-mode:nil -*- */
+
+#ifndef __X86_32_PAGE_H__
+#define __X86_32_PAGE_H__
+
+#define L1_PAGETABLE_SHIFT       12
+#define L2_PAGETABLE_SHIFT       22
+#define PAGE_SHIFT               L1_PAGETABLE_SHIFT
+
+#define ENTRIES_PER_L1_PAGETABLE 1024
+#define ENTRIES_PER_L2_PAGETABLE 1024
+
+#define __PAGE_OFFSET          (0xFC400000)
+
+#ifndef __ASSEMBLY__
+#include <xen/config.h>
+typedef struct { unsigned long l1_lo; } l1_pgentry_t;
+typedef struct { unsigned long l2_lo; } l2_pgentry_t;
+#endif /* !__ASSEMBLY__ */
+
+/* Strip type from a table entry. */
+#define l1_pgentry_val(_x) ((_x).l1_lo)
+#define l2_pgentry_val(_x) ((_x).l2_lo)
+
+/* Add type to a table entry. */
+#define mk_l1_pgentry(_x)  ( (l1_pgentry_t) { (_x) } )
+#define mk_l2_pgentry(_x)  ( (l2_pgentry_t) { (_x) } )
+
+/* Turn a typed table entry into a physical address. */
+#define l1_pgentry_to_phys(_x) (l1_pgentry_val(_x) & PAGE_MASK)
+#define l2_pgentry_to_phys(_x) (l2_pgentry_val(_x) & PAGE_MASK)
+
+/* Turn a typed table entry into a page index. */
+#define l1_pgentry_to_pfn(_x) (l1_pgentry_val(_x) >> PAGE_SHIFT) 
+#define l2_pgentry_to_pfn(_x) (l2_pgentry_val(_x) >> PAGE_SHIFT)
+
+/* Pagetable walking. */
+#define l2_pgentry_to_l1(_x) \
+  ((l1_pgentry_t *)__va(l2_pgentry_to_phys(_x)))
+
+/* Given a virtual address, get an entry offset into a page table. */
+#define l1_table_offset(_a) \
+  (((_a) >> L1_PAGETABLE_SHIFT) & (ENTRIES_PER_L1_PAGETABLE - 1))
+#define l2_table_offset(_a) \
+  ((_a) >> L2_PAGETABLE_SHIFT)
+
+/* Given a virtual address, get an entry offset into a linear page table. */
+#define l1_linear_offset(_a) ((_a) >> PAGE_SHIFT)
+
+/* Root page-table definitions. */
+#define pagetable_t l2_pgentry_t
+#define pagetable_val(_x)  ((_x).l2_lo)
+#define mk_pagetable(_x)   ( (l2_pgentry_t) { (_x) } )
+#define ENTRIES_PER_PAGETABLE ENTRIES_PER_L2_PAGETABLE
+
+#endif /* __X86_32_PAGE_H__ */
diff --git a/xen/include/asm-x86/x86_64/page.h b/xen/include/asm-x86/x86_64/page.h
new file mode 100644 (file)
index 0000000..7d0cc84
--- /dev/null
@@ -0,0 +1,84 @@
+/* -*-  Mode:C; c-basic-offset:4; tab-width:4; indent-tabs-mode:nil -*- */
+
+#ifndef __X86_64_PAGE_H__
+#define __X86_64_PAGE_H__
+
+#define L1_PAGETABLE_SHIFT       12
+#define L2_PAGETABLE_SHIFT       21
+#define L3_PAGETABLE_SHIFT       30
+#define L4_PAGETABLE_SHIFT       39
+#define PAGE_SHIFT               L1_PAGETABLE_SHIFT
+
+#define ENTRIES_PER_L1_PAGETABLE 512
+#define ENTRIES_PER_L2_PAGETABLE 512
+#define ENTRIES_PER_L3_PAGETABLE 512
+#define ENTRIES_PER_L4_PAGETABLE 512
+
+#define __PAGE_OFFSET          (0xFFFF830000000000)
+
+/* These may increase in future (phys. bits in particular). */
+#define PADDR_BITS              40
+#define VADDR_BITS              48
+#define PADDR_MASK              ((1UL << PADDR_BITS)-1)
+#define VADDR_MASK              ((1UL << VADDR_BITS)-1)
+
+#ifndef __ASSEMBLY__
+#include <xen/config.h>
+typedef struct { unsigned long l1_lo; } l1_pgentry_t;
+typedef struct { unsigned long l2_lo; } l2_pgentry_t;
+typedef struct { unsigned long l3_lo; } l3_pgentry_t;
+typedef struct { unsigned long l4_lo; } l4_pgentry_t;
+#endif /* !__ASSEMBLY__ */
+
+/* Strip type from a table entry. */
+#define l1_pgentry_val(_x) ((_x).l1_lo)
+#define l2_pgentry_val(_x) ((_x).l2_lo)
+#define l3_pgentry_val(_x) ((_x).l3_lo)
+#define l4_pgentry_val(_x) ((_x).l4_lo)
+
+/* Add type to a table entry. */
+#define mk_l1_pgentry(_x)  ( (l1_pgentry_t) { (_x) } )
+#define mk_l2_pgentry(_x)  ( (l2_pgentry_t) { (_x) } )
+#define mk_l3_pgentry(_x)  ( (l3_pgentry_t) { (_x) } )
+#define mk_l4_pgentry(_x)  ( (l4_pgentry_t) { (_x) } )
+
+/* Turn a typed table entry into a physical address. */
+#define l1_pgentry_to_phys(_x) (l1_pgentry_val(_x) & (PADDR_MASK & PAGE_MASK))
+#define l2_pgentry_to_phys(_x) (l2_pgentry_val(_x) & (PADDR_MASK & PAGE_MASK))
+#define l3_pgentry_to_phys(_x) (l3_pgentry_val(_x) & (PADDR_MASK & PAGE_MASK))
+#define l4_pgentry_to_phys(_x) (l4_pgentry_val(_x) & (PADDR_MASK & PAGE_MASK))
+
+/* Turn a typed table entry into a page index. */
+#define l1_pgentry_to_pfn(_x) (l1_pgentry_val(_x) >> PAGE_SHIFT) 
+#define l2_pgentry_to_pfn(_x) (l2_pgentry_val(_x) >> PAGE_SHIFT)
+#define l3_pgentry_to_pfn(_x) (l3_pgentry_val(_x) >> PAGE_SHIFT)
+#define l4_pgentry_to_pfn(_x) (l4_pgentry_val(_x) >> PAGE_SHIFT)
+
+/* Pagetable walking. */
+#define l2_pgentry_to_l1(_x) \
+  ((l1_pgentry_t *)__va(l2_pgentry_to_phys(_x)))
+#define l3_pgentry_to_l2(_x) \
+  ((l2_pgentry_t *)__va(l3_pgentry_to_phys(_x)))
+#define l4_pgentry_to_l3(_x) \
+  ((l3_pgentry_t *)__va(l4_pgentry_to_phys(_x)))
+
+/* Given a virtual address, get an entry offset into a page table. */
+#define l1_table_offset(_a) \
+  (((_a) >> L1_PAGETABLE_SHIFT) & (ENTRIES_PER_L1_PAGETABLE - 1))
+#define l2_table_offset(_a) \
+  (((_a) >> L2_PAGETABLE_SHIFT) & (ENTRIES_PER_L2_PAGETABLE - 1))
+#define l3_table_offset(_a) \
+  (((_a) >> L3_PAGETABLE_SHIFT) & (ENTRIES_PER_L3_PAGETABLE - 1))
+#define l4_table_offset(_a) \
+  (((_a) >> L4_PAGETABLE_SHIFT) & (ENTRIES_PER_L4_PAGETABLE - 1))
+
+/* Given a virtual address, get an entry offset into a linear page table. */
+#define l1_linear_offset(_a) (((_a) & VADDR_MASK) >> PAGE_SHIFT)
+
+/* Root page-table definitions. */
+#define pagetable_t l4_pgentry_t
+#define pagetable_val(_x)  ((_x).l4_lo)
+#define mk_pagetable(_x)   ( (l4_pgentry_t) { (_x) } )
+#define ENTRIES_PER_PAGETABLE ENTRIES_PER_L4_PAGETABLE
+
+#endif /* __X86_64_PAGE_H__ */